package main

import (
	"go_dev/day7/review/balance"
	"fmt"
	"os"
	"strconv"
)

func main(){
	var objs []*balance.Instance
	for i := 0; i < 5; i++ {
		host := "Host" + strconv.Itoa(i)
		port := 80 + i
		obj := balance.NewInstance(host, port)
		objs = append(objs, obj)
	}

	var balancer balance.Balancer
	var arg = "round"
	if len(os.Args) > 1 {
		arg = os.Args[1]
	}
	if arg == "random" {
		balancer = &balance.RandomBalance{}
	} else if arg == "round" {
		balancer = &balance.RoundRobinBalance{}
	} else {
		arg = "random"
		// 不同的参数对应不同的负载均衡算法，生成不同的实例
		// 直接再通过实例调用里面的方法，是不需要用到接口的
		// 在这里，要用balancer这个变量来接收不同的结构体类型，就需要用到接口了
		// 只要实现了接口的里DoBalance()方法，就可以赋值给接口，之后就用接口统一调用这个方法
		balancer = &balance.RandomBalance{}
	}
	fmt.Println("负载均衡算法:", arg)

	// 调用10次，检查负载均衡的效果
	for i := 0; i < 10; i++{
		obj, err := balancer.DoBalance(objs)  // 通过接口统一调用方法
		if err != nil {
			fmt.Println("异常:", err)
			continue
		}
		fmt.Println(obj)
	}
}